/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.servlets;

import com.ejb.MensajeFacadeLocal;
import com.ejb.UsuarioFacadeLocal;
import com.model.Mensaje;
import com.model.MensajeComunicacion;
import com.model.Usuario;
import com.thoughtworks.xstream.XStream;
import com.utils.Tipos;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.ArrayList;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.*;

/**
 *
 * @author juan_antonio
 */
@WebServlet(name = "PrincipalServlet", urlPatterns = {"/PrincipalServlet"})
public class PrincipalServlet extends HttpServlet {

    @EJB
    private MensajeFacadeLocal mensajeFacade;
    @EJB
    private UsuarioFacadeLocal usuarioFacade;

    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        ServletInputStream in = request.getInputStream();
        DataInputStream dis = new DataInputStream(in);
        int tipo_mensaje = dis.readInt();

        ServletOutputStream out = response.getOutputStream();
        DataOutputStream dos = new DataOutputStream(out);

        String email;
        String mensajes;
        String origen;
        String destino;
        String contenido;
        String mensaje_leido;
        String password;
        String key;
        boolean resultado;
        switch (tipo_mensaje) {
            case Tipos.LOGIN:
                email = dis.readUTF();
                password= dis.readUTF();
                key = this.doLogin(email, password);
                if (key != null) {
                    dos.writeUTF(key);
                    mensajes = this.getMessages(email);
                    dos.writeUTF(mensajes);
                }
                break;
            case Tipos.SEND_MESSAGE:
                origen=dis.readUTF();
                destino=dis.readUTF();
                contenido=dis.readUTF();
                resultado=this.sendMessage(origen, destino, contenido);
                dos.writeBoolean(resultado);
                break;
            case Tipos.GET_MESSAGES:
                email = dis.readUTF();
                mensajes = this.getMessages(email);
                dos.writeUTF(mensajes);
                break;
            case Tipos.READ_MESSAGE:
                mensaje_leido=dis.readUTF();
                XStream xstream = new XStream();
                MensajeComunicacion m = (MensajeComunicacion)xstream.fromXML(mensaje_leido);
                resultado = this.mensajeLeido(m);
                dos.writeBoolean(resultado);
                break;
        }
        out.flush();
        out.close();
    }

    public String doLogin(String email, String password) {

        Usuario user = this.usuarioFacade.findByEmailAndPassword(email, password);
        if (user != null) {
            return this.getPrivateKey(email);
        } else {
            return null;
        }

    }

    public String getPrivateKey(String email) {
        return "Clave de " + email;
    }

    public String getMessages(String email) {
        ArrayList<Mensaje> listaMensajes = (ArrayList<Mensaje>) this.mensajeFacade.findMessagesByUserDestino(email);
        ArrayList<MensajeComunicacion> l = new ArrayList<MensajeComunicacion>();
        for(Mensaje m : listaMensajes){
            MensajeComunicacion mc = new MensajeComunicacion(m.getIdMensaje(), m.getUserOrigen().getEmail(), m.getUserDestino().getEmail(), m.getContenido());
            l.add(mc);
        }
        XStream xstream = new XStream();
        String xml = xstream.toXML(l);
        return xml;
    }
    
    public boolean sendMessage(String origen, String destino, String contenido){
        Usuario userOrigen = this.usuarioFacade.findByEmail(origen);
        Usuario userDestino = this.usuarioFacade.findByEmail(destino);
        Mensaje m = new Mensaje(BigDecimal.ZERO, contenido, 0);
        m.setUserOrigen(userOrigen);
        m.setUserDestino(userDestino);
        this.mensajeFacade.create(m);
        return true;
    }

    public boolean mensajeLeido(MensajeComunicacion m){
        Mensaje mensaje = this.mensajeFacade.find(m.getIdMensaje());
        mensaje.setLeido(1);
        this.mensajeFacade.edit(mensaje);
        return true;
    }
            
    //public boolean sendMessage()
    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    
}
